package org.huangrui.spark.scala.core.rdd.serial

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.huangrui.spark.java.core.rdd.serial.Search

/**
 * @Author hr
 * @Create 2024-10-18 13:02 
 */
object Spark01_RDD_Serial_1 {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val sc = new SparkContext(conf)
    val rdd = sc.makeRDD(List("Hadoop", "Hive", "Spark", "Flink"), 2)

    // RDD算子(方法)的逻辑代码是在Executor端执行的，其他的代码都是Driver端执行
    val search = new Search("H")
//    search.getMatch1(rdd)
    search.getMatch2(rdd)


    sc.stop()
  }
  // 查询对象
  // 类的构造参数其实是类的属性, 构造参数需要进行闭包检测，其实就等同于类进行闭包检测
  class Search(key: String) {
    /**
     * 函数序列化案例
     * @param rdd
     */
    def getMatch1(rdd: RDD[String]): Unit = {
      rdd.filter((x: String) => x.startsWith(key)).collect().foreach(println)
    }

    /**
     * 属性序列化案例
     * @param rdd
     */
    def getMatch2(rdd: RDD[String]): Unit = {
      val s = key
      rdd.filter((x: String) => x.startsWith(s)).collect().foreach(println)
    }
  }
}
